from typing import List

class Solution:
    def 水涨人高(self, 泳池: List[List[int]]) -> int:
        def 寻路(x):
            if 位置[x] != x:
                位置[x] = 寻路(位置[x])
            return 位置[x]

        边长 = len(泳池)
        位置 = list(range(边长 * 边长))
        水位所在序号 = [0] * (边长 * 边长)
        for 行号, 行 in enumerate(泳池):
            for 列号, 水位 in enumerate(行):
                水位所在序号[水位] = 行号 * 边长 + 列号
        for 水位 in range(边长 * 边长):
            行号, 列号 = 水位所在序号[水位] // 边长, 水位所在序号[水位] % 边长
            for 上下, 前后 in [(0, -1), (0, 1), (1, 0), (-1, 0)]:
                邻格行, 邻格列 = 行号 + 上下, 列号 + 前后
                if 0 <= 邻格行 < 边长 and 0 <= 邻格列 < 边长 and 泳池[邻格行][邻格列] <= 水位:
                    位置[寻路(邻格行 * 边长 + 邻格列)] = 寻路(水位所在序号[水位])
                if 寻路(0) == 寻路(边长 * 边长 - 1):
                    return 水位
        return -1

s = Solution()
assert(3 == s.水涨人高([[0,2],[1,3]]))
assert(16 == s.水涨人高([[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]]))
assert(5 == s.水涨人高([[3,2,4],[8,7,5],[0,6,1]]))